package reflection.dynamicproxy;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

/**
 *cglib动态代理
 *1.针对类实现代理
 *2.对指定目标类产生一个子类，通过方法拦截技术拦截所有父类方法的调用
 * @author 12609
 *
 */
public class CglibProxyTicketManager implements MethodInterceptor{
	// 用这个类来创建代理对象(被代理类的子类)
	private Enhancer enhancer = new Enhancer();
	/**
	 * 创建代理实例
	 * @param clazz
	 * @return
	 */
	public Object getProxy(Class clazz) {
		
		
		//设置要代理的目标类
		enhancer.setSuperclass(clazz);
		//设置回调，当这个代理实例的方法被调用时，会调用intercept
		enhancer.setCallback(this);
		//创建返回代理类实例
		return enhancer.create();
		
	}
	
	
	/**
	 * 拦截所有目标类方法的调用
	 * targetObject 目标类实例
	 * method 目标方法的反射对象
	 * args 方法的参数
	 * proxy 代理类的实例
	 */
	@Override
	public Object intercept(Object targetObject, Method method, Object[] args, MethodProxy proxy) throws Throwable {
		
		Object result = null;
		
		//前置增强
		checkIdentity();
		//代理类调用父类方法
		result = proxy.invokeSuper(targetObject, args);
		//后置增强
		log();
		
		return result;
	}
	
	/**
     * 身份验证
     */
    private void checkIdentity(){
        System.out.println("身份验证--------------");
    }
    /**
     * 打印日志
     */
    private void log(){
        System.out.println("日志..." );
    }

}
